原文链接:
https://deepsense.io/region-of-interest-pooling-explained/

Introduction

感兴趣区域池化(也称作RoI pooling)是一个广泛应用在目标检测任务的卷积神经网络中的操作。它的目的是对不规范的输入进行max pooling,以获得固定尺寸的feature maps(例如7×7)。

我们开源了TensorFlow下的RoI Pooling实现。(https://github.com/deepsense-io/roi-pooling)。在本文中,我们将要简单介绍这个有趣的神经网络层。在这之前,我们先从背景开始。

计算机视觉的两个主要任务是目标分类和目标检测(追踪表示不开心 ̄へ ̄)。前者系统需要对一幅图像中的显著物体进行分类标记。后者则需要在一幅图像中,对于所有的物体给出正确的标记和位置信息。当然还有一些其他有趣的计算机视觉领域,如图像分割,但今天我们只关心检测。在这个任务中,我们通常应该在所有目标旁画上bounding box,依据之前指定的类别集合,给他们分配一个类别。例如,假设我们正在开发自动驾驶的算法,我们就需要相机检测其他的汽车、行人、骑车的人等等。

在这种情况下,我们必须需在每个重要的目标周围画一个box,分配一个类别给它。这个任务比在MNIST或CIFAR上的分类任务要更有挑战性。视频的每一帧中,可能有多个目标,一些发生重叠,一些难以看清,一些则被遮挡。另外,对于这样一个算法,performance是一个关键的问题。尤其对于自动驾驶,我们必须每秒处理数十帧图像。

所以,我们该如何解决这个问题呢?

Typical architecture

我们今天将要讨论的目标检测架构主要分为两个步骤:

1、 Region Proposal: 给定一个输入图像,找出所有目标可能存在的位置。这个阶段的输出应该是一个bounding box的列表,列出所有可能存在目标的位置。这些通常被叫做region proposal或regions of interest。针对这个任务有一些方法,本文中不再讨论。

2、 Final classification: 对于来自前一阶段的每一个region proposal, 判断其属于目标类别中的某一类或是属于背景。这里我们可能会使用一个深度卷积网络。

img

通常在proposal环节,我们必须要产生大量的region of interest。为什么呢?如果一个目标在第一个阶段没有被检测出来,那么就不可能在第二个环节把它正确的分类。这就是为什么region proposals必须要有很高的查全率(recall)。这通常通过产生非常大量的proposals来实现(例如,每帧几千个)。他们中的大多数会在检测算法的第二个环节被分类为背景。

这种结构的一些问题有:

  • 产生大量的regions of interest可能会导致性能问题。这将使得实时的目标检测难以实现。
  • 这是处理速度方面的次优选择。后面会详细讲。
  • 不能实现端到端训练。也就是说,你不能在一次运行中训练系统所有的部分(这样能够产生更好的结果)。

这就是RoI Pooling为什么被提出了。

Region of interest pooling - description

Region of interest pooling是一个用于目标检测任务的神经网络层。它由Ross Girshick在2015年四月首次提出,在训练和测试中都显著的提升了速度。它还维持了检测的高精度。这个层有两个输入:

  • 从具有多个卷积和最大池化层的深度卷积网络中获得的固定大小的feature map。
  • 一个N×5的矩阵,表示感兴趣区域的列表,这里N是RoIs的数量。第一列表示图像下标,剩下的四个是左上和右下教的坐标。

img2

RoI Pooling实际上做了什么?对于输入列表中的每个感兴趣区域,它从输入feature map中截取对应的部分,并把它缩放到某个预训练的大小(比如7×7)。缩放通过如下完成:

  • 1、把region proposal划分成等大小的部分(其数目等同于输出的维度)。
  • 2、找出每个部分的最大值。
  • 3、把这些最大值复制到输出缓存中。

结果就是,从一列的不同大小的矩形,我们可以快速的得到对应的固定大小的feature maps。注意RoI Pooling的输出维度实际上并不依赖于输入feature map的大小,也不依赖于region proposal的大小。它仅仅决定于我们把proposal划分成几个部分。

RoI pooling的好处是什么?其中一个就是处理速度。如果一帧中有多个目标的proposals,我们依然可以对它们用同样的输入feature map。由于前期阶段的卷积操作计算量非常大,这种方法能够节省我们大量时间。

Region of interest pooling - example

让我们来看看一个小例子如何工作。我们将在一个8×8的feature map上进行RoI pooling的操作,只有一个感兴趣区域,输出大小为2×2。输入特征图长这样:

img3

假设我们有个region proposal:(0,3) (7,8)在图中看起来是这样:

img4

通常,会有多个feature maps和多个proposal。但这里我们想让例子简单一些。

通过把它划分成(2×2)的部分,我们得到:

img5

注意感兴趣区域的大小并不需要能被划分数目整除。

每个部分的最大值如下:

img6

如下为RoI Pooling层的输出。

img7

关于RoI pooling需要记住的最重要的是什么?

  • 它用在目标检测任务中
  • 它允许我们在卷积网络中复用feature map
  • 它能够明显加速训练和测试
  • 它允许以一种端到端的方式训练目标检测系统